package br.com.saeng2D.xml;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import br.com.saeng2D.objeto.AbstratoObjeto;
import br.com.saeng2D.objeto.apoio.Apoio1;
import br.com.saeng2D.objeto.apoio.Apoio2;
import br.com.saeng2D.objeto.apoio.Apoio3;
import br.com.saeng2D.objeto.forca.ForcaCentralizada;
import br.com.saeng2D.objeto.forca.ForcaDistribuida;
import br.com.saeng2D.objeto.forca.ForcaMomento;
import br.com.saeng2D.objeto.forca.ForcaTriangular;
import br.com.saeng2D.objeto.forca_d.ForcaDinamica;
import br.com.saeng2D.objeto.linha.Linha;
import br.com.saeng2D.objeto.ponto.Ponto;
import br.com.saeng2D.util.Util;

//Ouvinte de eventos para a api SAX
//Recria os objetos a partir do XML
public class ManipuladorXML extends DefaultHandler {
	private static final String ATRIBUTO_Q = "q";
	private static final String ATRIBUTO_X1 = "ponto1_x";
	private static final String ATRIBUTO_Y1 = "ponto1_y";
	private static final String ATRIBUTO_X2 = "ponto2_x";
	private static final String ATRIBUTO_Y2 = "ponto2_y";
	private static final String ATRIBUTO_GRAU = "grau";
	private static final String ELEMENTO_LINHA = "linha";
	private static final String ELEMENTO_FORCA_CEN = "forca_centralizada";
	private static final String ELEMENTO_FORCA_MOM = "forca_momento";
	private static final String ELEMENTO_APOIO1 = "apoio1";
	private static final String ELEMENTO_APOIO2 = "apoio2";
	private static final String ELEMENTO_APOIO3 = "apoio3";
	private static final String ATRIBUTO_VETORES = "vetores";
	private static final String VALOR_NEWTON = "stringValorNewton";
	private static final String ATRIBUTO_ORIGEM_X = "x";
	private static final String ATRIBUTO_ORIGEM_Y = "y";
	private static final String ELEMENTO_FORCA_DINAM = "forca_dinamica";
	private static final String ELEMENTO_FORCA_DINAM_DIST = "forcaDinamicaDistribuida";
	private static final String ELEMENTO_FORCA_DINAM_TRI = "forcaDinamicaTriangular";
	private List<AbstratoObjeto> objetos;
	
	public ManipuladorXML() {
		objetos = new ArrayList<AbstratoObjeto>();
	}
	
	public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
		if(ELEMENTO_LINHA.equals(name)) {
			int x1 = 0;
			int y1 = 0;
			int x2 = 0;
			int y2 = 0;
			for(int i=0; i<attributes.getLength(); i++) {
				if(ATRIBUTO_X1.equals(attributes.getQName(i))) {
					x1 = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_Y1.equals(attributes.getQName(i))) {
					y1 = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_X2.equals(attributes.getQName(i))) {
					x2 = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_Y2.equals(attributes.getQName(i))) {
					y2 = Integer.parseInt(attributes.getValue(i));
				} 
			}
			Ponto ponto1 = new Ponto(x1,y1);
			Ponto ponto2 = new Ponto(x2,y2);
			Linha linha = new Linha(ponto1, ponto2);
			objetos.add(linha);
		} else if(ELEMENTO_FORCA_CEN.equals(name)) {
			int q = 0;
			int oX = 0;
			int oY = 0;
			int grau = 0;
			String valorNewton = "";
			String stringVetores = "";
			for(int i=0; i<attributes.getLength(); i++) {
				if(ATRIBUTO_ORIGEM_X.equals(attributes.getQName(i))) {
					oX = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_ORIGEM_Y.equals(attributes.getQName(i))) {
					oY = Integer.parseInt(attributes.getValue(i));
				}else if(ATRIBUTO_Q.equals(attributes.getQName(i))) {
					q = Integer.parseInt(attributes.getValue(i));
				}else if(ATRIBUTO_VETORES.equals(attributes.getQName(i))) {
					stringVetores = attributes.getValue(i);
				}else if(ATRIBUTO_GRAU.equals(attributes.getQName(i))) {
					grau = Integer.parseInt(attributes.getValue(i));
				} else if(VALOR_NEWTON.equals(attributes.getQName(i))) {
					valorNewton = attributes.getValue(i);
				} 
			}
			ForcaCentralizada forca = new ForcaCentralizada(oX, oY);
			forca.restaurar(q, stringVetores, grau, valorNewton);
			objetos.add(forca);
		}else if(ELEMENTO_FORCA_MOM.equals(name)) {
			int q = 0;
			int oX = 0;
			int oY = 0;
			int grau = 0;
			String valorNewton = "";
			String stringVetores = "";
			for(int i=0; i<attributes.getLength(); i++) {
				if(ATRIBUTO_ORIGEM_X.equals(attributes.getQName(i))) {
					oX = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_ORIGEM_Y.equals(attributes.getQName(i))) {
					oY = Integer.parseInt(attributes.getValue(i));
				}else if(ATRIBUTO_Q.equals(attributes.getQName(i))) {
					q = Integer.parseInt(attributes.getValue(i));
				}else if(ATRIBUTO_VETORES.equals(attributes.getQName(i))) {
					stringVetores = attributes.getValue(i);
				}else if(ATRIBUTO_GRAU.equals(attributes.getQName(i))) {
					grau = Integer.parseInt(attributes.getValue(i));
				} else if(VALOR_NEWTON.equals(attributes.getQName(i))) {
					valorNewton = attributes.getValue(i);
				} 
			}
			ForcaMomento forcaMom = new ForcaMomento(oX, oY);
			forcaMom.restaurar(q, stringVetores, grau, valorNewton);
			objetos.add(forcaMom);
		}else if(ELEMENTO_FORCA_DINAM_DIST.equals(name)) {
			int oX = 0;
			int oY = 0;
			String valorNewton = "";
			int x1 = 0;
			int y1 = 0;
			int x2 = 0;
			int y2 = 0;
			Ponto ponto1;
			Ponto ponto2;
			for(int i=0; i<attributes.getLength(); i++) {
				if(ATRIBUTO_ORIGEM_X.equals(attributes.getQName(i))) {
					oX = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_ORIGEM_Y.equals(attributes.getQName(i))) {
					oY = Integer.parseInt(attributes.getValue(i));
				}else if(ATRIBUTO_X1.equals(attributes.getQName(i))) {
					x1 = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_Y1.equals(attributes.getQName(i))) {
					y1 = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_X2.equals(attributes.getQName(i))) {
					x2 = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_Y2.equals(attributes.getQName(i))) {
					y2 = Integer.parseInt(attributes.getValue(i));
				}  else if(VALOR_NEWTON.equals(attributes.getQName(i))) {
					valorNewton = attributes.getValue(i);
				}
			}
			ponto1 = new Ponto(x1,y1); 
			ponto2 = new Ponto(x2,y2);
			Linha linha = new Linha(ponto1,ponto2);
			ForcaDinamica forcaDinam = new ForcaDinamica("cor_forca_distribuida");
			forcaDinam.restaurar(oX, oY, linha, valorNewton);
			objetos.add(forcaDinam);
		} else if(ELEMENTO_APOIO1.equals(name)) {
			int q = 0;
			int oX = 0;
			int oY = 0;
			String stringVetores = "";
			for(int i=0; i<attributes.getLength(); i++) {
				if(ATRIBUTO_Q.equals(attributes.getQName(i))) {
					q = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_ORIGEM_X.equals(attributes.getQName(i))) {
					oX = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_ORIGEM_Y.equals(attributes.getQName(i))) {
					oY = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_VETORES.equals(attributes.getQName(i))) {
					stringVetores = attributes.getValue(i);
				}
			}
			Apoio1 apoio1 = new Apoio1(oX, oY);
			apoio1.restaurar(q, stringVetores);
			objetos.add(apoio1);
		} else if(ELEMENTO_APOIO2.equals(name)) {
			int q = 0;
			int oX = 0;
			int oY = 0;
			String stringVetores = "";
			
			for(int i=0; i<attributes.getLength(); i++) {
				if(ATRIBUTO_Q.equals(attributes.getQName(i))) {
					q = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_ORIGEM_X.equals(attributes.getQName(i))) {
					oX = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_ORIGEM_Y.equals(attributes.getQName(i))) {
					oY = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_VETORES.equals(attributes.getQName(i))) {
					stringVetores = attributes.getValue(i);
				}
			}
			Apoio2 apoio2 = new Apoio2(oX, oY);
			apoio2.restaurar(q, stringVetores);
			objetos.add(apoio2);
		} else if(ELEMENTO_APOIO3.equals(name)) {
			int q = 0;
			int oX = 0;
			int oY = 0;
			String stringVetores = "";
			for(int i=0; i<attributes.getLength(); i++) {
				if(ATRIBUTO_Q.equals(attributes.getQName(i))) {
					q = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_ORIGEM_X.equals(attributes.getQName(i))) {
					oX = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_ORIGEM_Y.equals(attributes.getQName(i))) {
					oY = Integer.parseInt(attributes.getValue(i));
				} else if(ATRIBUTO_VETORES.equals(attributes.getQName(i))) {
					stringVetores = attributes.getValue(i);
				}
			}
			Apoio3 apoio3 = new Apoio3(oX, oY);
			apoio3.restaurar(q, stringVetores);
			objetos.add(apoio3);
		}
	}
	
	public List<AbstratoObjeto> getObjetos() {
		return objetos;
	}
}